import axios from 'axios'
import { Message } from 'element-ui'
import store from '@/store'
import router from '@/router'
// 导入进度条插件
import NProgress from 'nprogress'
// 导入进度条样式
import 'nprogress/nprogress.css'
import { getTokenTime } from '@/utils/storage.js'
// 定义过期时间(时*分*秒*1000)
const timeOut = 2 * 60 * 60 * 1000
// 过期时间测试
// const timeOut = 10 * 1000

const request = axios.create({
  baseURL: 'https://www.liulongbin.top:8888/api/private/v1',
  timeout: 3000
})

// 请求拦截器
request.interceptors.request.use((config) => {
  // 当进入request拦截器，表示发送了请求，我们就开启进度条
  NProgress.start()
  const token = store.state.user.token
  // console.log(token)
  if (token) {
    // 如果token存在 注入token
    if (isTimeOut()) {
      // 说明token已经过期了，执行退出的功能
      store.commit('user/logout')
      // 会退到登录页面
      router.push('/login')
      return Promise.reject(new Error('token超时了'))
    }
    config.headers.Authorization = token
  }
  // 必须返回config
  return config
})
// 响应拦截器
request.interceptors.response.use(
  (res) => {
    // console.log(res)
    const { data, meta } = res.data
    // 当进入response拦截器，表示请求已经结束，我们就结束进度条
    NProgress.done()
    if (meta.status === 200) {
      return data
    } else if (meta.status === 400 && meta.msg !== '无效token') {
      // ^业务错误
      // 提示错误消息
      Message.error(meta.msg)
      // 不能这么写 return Promise.reject(err)，要new Error()创建一个错误对象
      // 返回执行错误 让当前的执行链跳出成功 直接进入 catch
      return Promise.reject(new Error(meta.msg))
    } else if (meta.status === 400 && meta.msg === '无效token') {
      Message.error('服务器异常')
      return Promise.reject(new Error('服务器异常'))
    }
  },
  (err) => {
    // ^请求错误
    // console.dir(err)
    // 提示错误信息
    Message.error(err.message)
    // 返回执行错误 让当前的执行链跳出成功 直接进入 catch
    return Promise.reject(err)
  }
)

// 封装token过期
function isTimeOut() {
  // 获取当前的时间戳
  const nowTime = Date.now()
  // 获取存储的过期时间
  const tokenTime = getTokenTime()
  const time = nowTime - tokenTime
  return time >= timeOut
}

export default request
